描述
观察者模式又叫发布订阅模式,拥有一个监听者,如果一个被监听者发生了改变则会通知到所有监听者。例子,警察和嫌疑犯之间就是观察者模式。微信朋友圈,相对于好友,你就是观察者,微信好友发送朋友圈你会收到通知
类图

代码实现
1 2 3 4 5 6 7 8 9 10 11 12
   | public class PoliceMan {     private String name;
      public PoliceMan(String name) {         this.name = name;     }
      public void name() {         System.out.println("我是:" + name + "收到消息");     }
  }
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | public class XianFan1 {     private String name;
      public XianFan1(String name) {         this.name = name;     }
      private List<PoliceMan> policeManList = new ArrayList<>();
      public void addPolice(PoliceMan policeMan) {         if (!policeManList.contains(policeMan)) {             policeManList.add(policeMan);         }     }
      public void run() {         System.out.println(name + "跑了");         notifyAllPoliceMan();     }     public void notifyAllPoliceMan(){         policeManList.stream().forEach(i -> i.name());     }
  }
  | 
 
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13
   | public class Main {     public static void main(String[] args) {         PoliceMan policeManA =new PoliceMan("警察:A");         PoliceMan policeManB =new PoliceMan("警察:B");         PoliceMan policeManC =new PoliceMan("警察:C");         XianFan1 xianFan1 =new XianFan1("嫌犯1");         xianFan1.addPolice(policeManA);         xianFan1.addPolice(policeManB);         xianFan1.addPolice(policeManC);         xianFan1.run();     } }
 
  | 
 

总结
可以看到在被观察者类上面存放观察者的集合,在调用观察者的相关方法的时候循环调用观察者,从而实现发布订阅模式。
被观察者需要提供添加观察者和通知观察者方法
- 观察者和被观察者的实现复合开闭原则
 
- 实现通知模式
 
- 如果观察者过多通知的时间成本加大
 
- 观察者只知道目标变化,但是具体变化情况不得而知。可以定义相关事件来区分